package com.sqlcheck.service.impl;

import com.sqlcheck.entity.ScanTask;
import com.sqlcheck.service.TemporaryCredentialService;
import com.sqlcheck.enums.GitPlatform;
import lombok.RequiredArgsConstructor;
import com.sqlcheck.enums.TaskType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * 扫描任务调度服务
 * 负责根据任务类型调度到合适的执行器
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ScanTaskDispatcherServiceImpl {

    private final UnifiedScanTaskExecutionServiceImpl unifiedExecutor;
    private final TemporaryCredentialService temporaryCredentialService;

    /**
     * 异步执行扫描任务
     */
    @Async
    public void executeTask(ScanTask task, String accessToken) {
        try {
            log.info("开始调度扫描任务: taskId={}, taskType={}", task.getId(), task.getTaskType());

            // 如果有访问令牌，存储到临时凭据服务中
            if (accessToken != null && !accessToken.trim().isEmpty()) {
                String platformStr = detectGitPlatform(task);
                if (platformStr != null) {
                    GitPlatform platform = GitPlatform.valueOf(platformStr.toUpperCase());
                    temporaryCredentialService.storeGitToken(task.getId(), platform, accessToken,
                            getTokenExpirationMinutes(task));
                }
            }

            // 根据任务类型选择执行器
            switch (task.getTaskType()) {
                case GIT_SOURCE_SCAN:
                    log.info("使用统一执行器处理Git源码扫描任务: taskId={}", task.getId());
                    unifiedExecutor.executeTask(task);
                    break;

                case DATABASE_DDL_SCAN:
                    log.info("使用统一执行器处理数据库DDL扫描任务: taskId={}", task.getId());
                    unifiedExecutor.executeTask(task);
                    break;

                case MANUAL_SQL:
                    // 对于其他类型，可能需要特殊处理或使用原有逻辑
                    log.warn("任务类型 {} 暂不支持统一执行器，跳过", task.getTaskType());
                    throw new UnsupportedOperationException("不支持的任务类型: " + task.getTaskType());

                default:
                    throw new UnsupportedOperationException("未知的任务类型: " + task.getTaskType());
            }

        } catch (Exception e) {
            log.error("任务调度失败: taskId={}, taskType={}", task.getId(), task.getTaskType(), e);
            throw e;
        }
    }

    /**
     * 从任务配置中检测Git平台
     */
    private String detectGitPlatform(ScanTask task) {
        try {
            // 这里可以从任务配置中解析Git平台信息
            // 简化实现：如果是Git相关任务，返回默认平台
            if (task.getTaskType() == TaskType.GIT_SOURCE_SCAN) {
                return "GITHUB"; // 默认平台，实际应该从配置中解析
            }
            return null;
        } catch (Exception e) {
            log.warn("检测Git平台失败: taskId={}", task.getId(), e);
            return null;
        }
    }

    /**
     * 获取令牌过期时间（分钟）
     */
    private int getTokenExpirationMinutes(ScanTask task) {
        // 默认60分钟，可以从任务配置中读取
        return 60;
    }
}